package 中国.杨森.实验室.jpa;

import java.time.LocalDateTime;
import java.util.List;

import javax.persistence.Tuple;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import org.junit.Test;

public class 单个对象基本操作 extends A操作
{
	@Test
	public void 增()
	{
		增(1);
	}

	private void 增(int size)
	{
		for (int i = 0; i < size; i++)
		{
			学生 xs = new 学生();
			xs.set姓名("学生" + i);
			xs.set年龄((short) i);
			xs.set创建时间(LocalDateTime.now());
			em.persist(xs);
		}
	}

	@Test
	public void 删()
	{
		增(1);
		变更事务();
		学生 xs = em.find(学生.class, 1);
		em.remove(xs);
	}

	@Test
	public void 改()
	{
		增(1);

		学生 xs = em.find(学生.class, 1);
		xs.set姓名("测试");
	}

	@Test
	public void 查()
	{
		增(1);
		学生 xs = em.find(学生.class, 1);
		if (xs == null)
		{
			throw new NullPointerException();
		}
		System.out.println(xs.get创建时间());
	}

	@Test
	public void 查_时间作为条件()
	{
		增(1);
		CriteriaBuilder cb = em.getCriteriaBuilder();
		CriteriaQuery<学生> cq = cb.createQuery(学生.class);
		Root<学生> root = cq.from(学生.class);
		cq.select(root);
//		cq.where(cb.between(root.get(学生_.创建时间), LocalDateTime.now().minusHours(1), LocalDateTime.now().plusHours(1)));
//		cq.where(cb.gt(cb.length(root.get(学生_.姓名)), 2));
		
		学生 xs = em.createQuery(cq).getSingleResult();
		System.out.println(xs.get创建时间());
	}

	@Test
	public void 查部分属性()
	{
		增(3);
		
		CriteriaBuilder cb = em.getCriteriaBuilder();
		CriteriaQuery<Tuple> cq = cb.createQuery(Tuple.class);
		Root<学生> root = cq.from(学生.class);
		Path<Short> 年龄Path = root.get(学生_.年龄);
		Path<String> 姓名Path = root.get(学生_.姓名);
		cq.multiselect(年龄Path, 姓名Path);
		List<Tuple> list = em.createQuery(cq).getResultList();
		for (int i = 0; i < list.size(); i++)
		{
			System.out.println(list.get(i).get(年龄Path) + " " + list.get(i).get(姓名Path));
		}
	}
	
	@Test
	public void 批量查()
	{
		增(10);

		CriteriaBuilder cb = em.getCriteriaBuilder();
		CriteriaQuery<学生> cq = cb.createQuery(学生.class);
		Root<学生> root = cq.from(学生.class);
		cq.select(root);

		Predicate tj = cb.or(cb.equal(root.get(学生_.姓名), "学生1"), cb.ge(root.get(学生_.年龄), 5));
		cq.where(tj);
		cq.orderBy(cb.desc(root.get(学生_.年龄)));

		cq.groupBy(root.get(学生_.姓名));

		List<学生> list = em.createQuery(cq).getResultList();
		if (list.size() < 0)
		{
			throw new NullPointerException();
		}
		for (int i = 0; i < list.size(); i++)
		{
			System.out.println(list.get(i).get姓名());
		}

		System.out.println("------------分页-----------------");

		list = em.createQuery(cq).setMaxResults(3).setFirstResult(2).getResultList();
		if (list.size() < 0)
		{
			throw new NullPointerException();
		}
		for (int i = 0; i < list.size(); i++)
		{
			System.out.println(list.get(i).get姓名());
		}
	}

	@Test
	public void 统计总量()
	{
		增(10);

		CriteriaBuilder cb = em.getCriteriaBuilder();
		CriteriaQuery<Long> cq = cb.createQuery(Long.class);
		Root<学生> root = cq.from(学生.class);
		cq.select(cb.count(root));

		Long 总数 = em.createQuery(cq).getSingleResult();
		System.out.println(总数);
	}
}
